/*
 * Proyecto fin de master. Servicio de alertas 112
 * Jorge Tarancon Iglesias
 * Master en desarrollo de aplicaciones para Internet y Moviles
 */
package es.us.mwm.services;

import es.us.mwm.entities.Alerts;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import org.primefaces.push.PushContext;
import org.primefaces.push.PushContextFactory;

/**
 * Clase para la publicacion del servicioREST que recogera las alertas enviadas desde los dispositivos moviles
 *
 * @author y0rg
 */
@Stateless

@Path("alert") //http://localhost:8080/mAlertas112/service/alert
public class ServiceREST extends AbstractFacade<Alerts> {

    @PersistenceContext(unitName = "Alertas112PU")
    private EntityManager em;

    public ServiceREST() {
        super(Alerts.class);

    }

    @GET
    @Produces("text/html")
    public String getHtml() {
        return "<html><body><h1>Hello, World!!</body></h1></html>";
    }

    /**
     * Metodo para añadir una alerta desde el webservice por GET
     * USAR PREFERENTEMENTE POST (application/json)
     * @param type
     * @param longitude
     * @param latitude
     * @param name
     * @param phone
     * @param description
     */
    @POST
    @Produces("application/xml")
    public String getHTML(@FormParam("type") String type, @FormParam("longitude") String longitude, @FormParam("latitude") String latitude,
            @FormParam("name") String name, @FormParam("phone") String phone, @FormParam("description") String description) {

        //Alerts alert = new Alerts(type, Double.parseDouble(latitude), Double.parseDouble(longitude), description, Long.parseLong(phone), name);
        Alerts alert = new Alerts();
        alert.setDate(new Date());
        alert.setDescription("");
        alert.setLatitude(Double.parseDouble(latitude));
        alert.setLongitude(Double.parseDouble(longitude));
        alert.setName(name);
        alert.setPhone(Integer.parseInt(phone));
        alert.setType(type);
        alert.setUser(null);             
        super.create(alert);
        
        //Mensaje push del servidor para que se actualicen las tablas de los usuarios del sistema
        PushContext pushContext = PushContextFactory.getDefault().getPushContext();
        pushContext.push("/newAlert", "message");
        //TODO        
        //Falta añadir la respuesta del sistema y que recogeran los dispositivos como alerta recibida
        return "<xml>OK</xml>";
    }

    /**
     * Metodo que recoge alertas en formato JSON, almacena en la base de datos y manda mensaje push desde el servidor
     * @param alert alerta en formato json
     * @return
     */
    @POST
    @Consumes("application/json")
    @Produces("application/xml")
    public String created(Alerts alert) {      
        //Añadimos la fecha a la alerta
        alert.setDate(new Date());
        //La almacenamos en la base de datos
        super.create(alert);
        
        //Mensaje push del servidor para que se actualicen las tablas de los usuarios del sistema
        PushContext pushContext = PushContextFactory.getDefault().getPushContext();
        pushContext.push("/newAlert", "message");
        //Si todo correcto devolvemos la cadena
        return "<xml>OK</xml>";
    }

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }
}
